﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using DAL.DataSourceInterface;
using DAL.Entities;
using DAL.DataSourceImplementation.DataSourceDB;
using DAL.DataSourceImplementation.HelpersDAO;
using System.Transactions;
using System.Data.SqlClient;

namespace DAL.DataSourceImplementation
{
    public class PropiedadDAO : BaseDAO<Propiedad>, IPropiedadDAO
    {
        #region [Constructor]
        private static string connName;
        public PropiedadDAO(string _connName)
        {
            connName = _connName;
        }
        #endregion

        public List<Propiedad> GetMisPropiedades(int? rutUsuario, int? tipoPersona, int? pageIndex, int? pageSize, out int total)
        {
            if (pageIndex < 1 || pageSize < 1)
            {
                throw new Exception("");
            }

            int pIndex = pageIndex.GetValueOrDefault();
            int pSize = pageSize.GetValueOrDefault();

            total = 0;

            List<Propiedad> listPropiedad = new List<Propiedad>();
            using (PublicaTuPropiedadDB db = new PublicaTuPropiedadDB(connName))
            {
                listPropiedad = db.Propiedad.Where(p =>
                    p.IPER_RUT_FK == ((rutUsuario != null) ? rutUsuario : p.IPER_RUT_FK)
                    && p.ITPER_FK == ((tipoPersona != null) ? tipoPersona : p.ITPER_FK)
                    && p.BPRO_ESTADO).ToList();

                if (pIndex > 0 && pSize > 0)
                {
                    total = listPropiedad.Count();
                    listPropiedad = PageResult(listPropiedad, pIndex, pSize, total);
                }
            }

            return listPropiedad;
        }

        public void CreatePropiedadTerreno(Propiedad propiedad, Terreno terreno)
        {
            try
            {
                int currentId = 0;
                using (PublicaTuPropiedadDB db = new PublicaTuPropiedadDB(connName))
                {
                    db.Propiedad.Add(propiedad);
                    db.Propiedad.Create();
                    db.SaveChanges();
                    currentId = db.Propiedad.Max(p => p.IPRO_PK);

                    terreno.IPRO_FK = currentId;
                    db.Terreno.Add(terreno);
                    db.Terreno.Create();
                    db.SaveChanges();
                }
            }
            catch (Exception ex)
            {
                throw new Exception(ex.Message);
            }
        }

        public void CreatePropiedadOficina(Propiedad propiedad, Oficina oficina)
        {
            try
            {
                int currentId = 0;

                using (PublicaTuPropiedadDB db = new PublicaTuPropiedadDB(connName))
                {
                    db.Propiedad.Add(propiedad);
                    db.Propiedad.Create();
                    db.SaveChanges();
                    currentId = db.Propiedad.Max(p => p.IPRO_PK);

                    oficina.IPRO_FK = currentId;
                    db.Oficina.Add(oficina);
                    db.Oficina.Create();
                    db.SaveChanges();
                }
            }
            catch (Exception ex)
            {
                throw new Exception(ex.Message);
            }
        }

        public void CreatePropiedadDepartamento(Propiedad propiedad, Departamento departamento)
        {
            try
            {
                int currentId = 0;

                using (PublicaTuPropiedadDB db = new PublicaTuPropiedadDB(connName))
                {
                    db.Propiedad.Add(propiedad);
                    db.Propiedad.Create();
                    db.SaveChanges();
                    currentId = db.Propiedad.Max(p => p.IPRO_PK);

                    departamento.IPRO_FK = currentId;
                    db.Departamento.Add(departamento);
                    db.Departamento.Create();
                    db.SaveChanges();
                }
            }
            catch (Exception ex)
            {
                throw new Exception(ex.Message);
            }
        }

        public void CreatePropiedadCasa(Propiedad propiedad, Casa casa)
        {
            try
            {
                int currentId = 0;

                using (PublicaTuPropiedadDB db = new PublicaTuPropiedadDB(connName))
                {
                    db.Propiedad.Add(propiedad);
                    db.Propiedad.Create();
                    db.SaveChanges();
                    currentId = db.Propiedad.Max(p => p.IPRO_PK);

                    casa.IPRO_FK = currentId;
                    db.Casa.Add(casa);
                    db.Casa.Create();
                    db.SaveChanges();
                }
            }
            catch (Exception ex)
            {
                throw new Exception(ex.Message);
            }
        }
    }
}
